#ifndef FIFO_H_
#define FIFO_H_

#include <stddef.h>
#include <sys/types.h>
#include "config.h"

struct fifo {
    size_t start;
    size_t end;
    size_t size;
    void *data;
};

struct fifo *fifo_new(size_t size);
void fifo_del(struct fifo *f);
size_t fifo_used(struct fifo *fifo);
size_t fifo_unused(struct fifo *fifo);
size_t fifo_is_empty(struct fifo *fifo);
size_t fifo_is_full(struct fifo *fifo);
void fifo_reset(struct fifo *fifo);
size_t fifo_write(struct fifo *fifo, const void *buf, size_t len);
size_t fifo_peek(struct fifo *fifo, size_t off, void *buf, size_t len);
size_t fifo_read(struct fifo *fifo, void *buf, size_t len);
ssize_t fifo_write_from_fd(struct fifo *fifo, int fd);
ssize_t fifo_read_to_fd(struct fifo *fifo, int fd);

#endif /* FIFO_H_ */
